package com.resou.reader.utils;


import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * 此类创建类似于FragmentPageAdapter的左右滑动视图，但是显示视图，而不是fragment,
 */
public abstract class GalleryAdapter extends PagerAdapter {

    private static final String TAG = "GalleryAdapter";

    private final LayoutInflater mLayoutInflater;
    /**
     * click事件侦听器，它将单击事件传播到父级或任何其他侦听器集
     */
    private OnItemClickListener mOnItemClickListener;

    /**
     * 设置一个侦听器，该侦听器将通知在viewpager的页面上检测到的任何点击事件。
     *
     * @param onItemClickListener 监听器。 如果{@code null}它将禁止发送任何事件。
     */
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    protected GalleryAdapter(@NonNull Context context) {
        super();
        // Inflater将用于创建所有必要的页面
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // 为了安全起见，请检查我们是否有有效的项目列表 - 永远不会返回无效大小。
        return 1;
    }


    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, final int position) {
        // 此方法应创建作为参数传递给它的给定位置的页面。
        // 在我们的例子中，我们填充布局以创建视图对象的层次结构，然后为其中的ImageView设置资源。
        // 最后，将填充的视图添加到容器（应该是ViewPager）并返回它。

        // 填充布局
        View view = onInflateLayout(mLayoutInflater, container, position);

        // 将我们填充后的视图添加到容器中
        container.addView(view);

        //返回视图
        return view;
    }

    protected abstract View onInflateLayout(LayoutInflater layoutInflater, ViewGroup container, int position);

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // 从容器中删除给定位置的页面。
        // 我们只是使用 removeView() 删除了对象，但也可以通过传递位置来使用removeViewAt（）。
        try {
            // 从容器中删除视图
            container.removeView((View) object);

            // 删除此视图使用的所有资源
            unbindDrawables((View) object);

        } catch (Exception e) {
            Log.w(TAG, "destroyItem: failed to destroy item and clear it's used resources", e);
        }
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        // instantiateItem（）返回的对象是键/标识符。
        // 此方法检查传递给它的视图（表示页面）是否与该键相关联。
        // PagerAdapter需要它才能正常运行。
        return view == object;
    }

    /**
     * 从提供的视图中递归取消绑定任何资源。
     * 在使提供的视图本身无效之前，此方法将清除视图的所有子项的资源。
     *
     * @param view 需要解除资源绑定的视图。
     */
    protected void unbindDrawables(View view) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }


//    /**
//     * 将图库图像显示在提供的图像视图中。
//     *
//     * @param galleryView 将显示图像的视图。
//     * @param galleryItem 从中获取图像的项目。
//     */
//    private void displayGalleryItem(ImageView galleryView, Item galleryItem) {
//        if (null != galleryItem) {
//            Glide.with(galleryView.getContext()) // 使用实际视图的上下文绑定它
//                    .load(galleryItem.getImageUrl()) //加载图像
//                    .asBitmap() // 我们所有的图像都是静态的，我们希望将它们显示为位图
//                    .format(DecodeFormat.PREFER_RGB_565) //解码格式 - 根本不会使用alpha
//                    .centerCrop() // 比例类型
//                    .placeholder(R.drawable.default_product_400_land) //图像加载时显示临时持有者
//                    .animate(R.anim.fade_in) //需要手动设置动画为位图，不能使用交叉淡入淡出
//                    .thumbnail(0.2f) // 使用缩略图，可以显示图像的缩小版本
//                    .into(galleryView); //Voilla - 目标视图
//        }
//    }

    interface OnItemClickListener {
        void onItemClicked();
    }
}